# -*- coding:utf-8 -*-
# @FileName     :alien_invasion.py
# @Time         :2021/8/16 22:09
# @Author       :Wu Hongyi
# @Copyright    :Wu Hongyi
# Function description:
'''

'''
# @version      :Version1.0
# Modification description:
'''

'''
# 导入相应的模块
import sys

import pygame

from settings import Settings
from ship import Ship

class AlienInvasion:
    """管理游戏资源和行为的类"""

    def __init__(self):
        """初始化游戏并创建游戏资源"""

        pygame.init()       # 初始化背景设置
        self.settings = Settings()      # 创建设置实例作为AlienInvasion类的设置属性
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        self.ship = Ship(self)      # 创建飞船实例作为AlienInvasion类的飞船属性
        # 上述语句中参数self 指向的是当前AlienInvasion 实例。这个参数让Ship能够访问游戏资源，如对象screen 。

    def run_game(self):
        """开始游戏的主循环"""

        while True:
            self._check_events()    # 监视键盘和鼠标事件,判断何时结束游戏
            self._update_screen()   # 更新屏幕上的图像，并切换到新屏幕


# 注意：辅助方法的名称以单个下划线打头。辅助方法 在类中执行任务，但并非是通过实例调用的
    def _check_events(self):
        """监视键盘和鼠标事件 侦听 事件并根据发生的 事件类型 执行合适的任务。"""

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            # 当玩家单击游戏窗口的关闭按钮时，将检测到pygame.QUIT 事件，进而调用sys.exit() 来退出游戏

    def _update_screen(self):
        """更新屏幕上的图像，并切换到新屏幕"""

        # 每次循环时都重绘屏幕 用背景色填充屏幕 方法fill() 用于处理surface，只接受一个实参：一种颜色
        self.screen.fill(self.settings.bg_color)  # 填充背景色
        self.ship.blitme()  # 绘制飞船在屏幕底部中央 确保它出现在背景前面

        # 让最近绘制的屏幕可见    pygame.display.flip() 将不断更新屏幕，以显示元素的新位置，
        # 并且在原来的位置隐藏元素，从而营造平滑移动的效果。
        pygame.display.flip()


if __name__ == '__main__':
    # 创建游戏实例并运行游戏   ，仅当直接运行该文件时，它们才会执行
    ai = AlienInvasion()        # 创建外星人入侵游戏实例
    ai.run_game()               # 调用开始游戏方法运行该游戏
